package cn.jbolt.ai.core.vdb;

import cn.jbolt.util.Result;
import com.jboltai.capability.vdb.JBoltVDB;
import com.jboltai.capability.vdb.VDBOptResult;
import com.jboltai.capability.vdb.collection.field.VDBField;
import com.jboltai.capability.vdb.search.VDBConditions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;


import java.util.List;
@Service
public class VdbCollectionServiceImpl implements VdbCollectionService {

    private static final Logger logger = LoggerFactory.getLogger(VdbCollectionServiceImpl.class);

    /**
     * 往向量化数据库中的指定表插入数据
     *
     * @param collectionName     集合的名称,表名
     * @param content     要向量化的内容
     * @param fieldValues
     */
    public Result insertData(String vdbResourceId, String collectionName, String id, String content, Object... fieldValues) {
        try {
            VDBOptResult<Integer> result = JBoltVDB.use(vdbResourceId).
                    insert(collectionName, id, content, fieldValues);
            logger.info("向量化数据插入成功,内容:{},其他字段:{}", content, fieldValues);
            if (result.isSuccess() == false) {
                logger.error("向量化数据插入失败,失败原因:{}", result.getFullMsg());
                return Result.error(result.getFullMsg());
            }
        } catch (Exception e) {
            logger.error("向量化数据插入失败,失败原因:{}", e.getMessage());
            return Result.error(e.getMessage());
        }
        return Result.success();
    }

    /**
     * 创建向量化数据库中的表
     *
     * @param collectionName
     * @param list
     * @return
     */
    public Result createCollection(String vdbId, String collectionName, List<VDBField> list) {
        VDBOptResult<Boolean> result = JBoltVDB.use(vdbId).createCollection(collectionName, list);
        if (result.isSuccess()) {
            logger.info("创建VDB中的{}成功", collectionName);
            return Result.success();
        } else {
            logger.error("创建VDB中的{}失败,失败原因:{}", collectionName, result.getFullMsg());
            return Result.error(result.getFullMsg());
        }
    }


    /**
     * 移除数据库中的表
     *
     * @param vdbId
     * @param collectionName
     * @return
     */
    @Override
    public Result removeCollection(String vdbId, String collectionName) {
        VDBOptResult<Boolean> result = JBoltVDB.use(vdbId).dropCollection(collectionName);
        if (result.isSuccess()) {
            logger.info("移除VDB中的{}成功", collectionName);
            return Result.success();
        } else {
            logger.error("移除VDB中的{}失败,失败原因:{}", collectionName, result.getFullMsg());
            return Result.error(result.getFullMsg());
        }
    }

    public Result removeDataById(String vdbId, String collectionName,String id) {
        VDBOptResult<Boolean> result = JBoltVDB.use(vdbId).deleteById(collectionName,id);
        if (result.isSuccess()) {
            logger.info("移除VDB中的{}的{}成功", collectionName,id);
            return Result.success();
        } else {
            logger.error("移除VDB中的{}的{}失败,失败原因:{}", collectionName, id,result.getFullMsg());
            return Result.error(result.getFullMsg());
        }
    }

    public Result removeDataByConditions(String vdbId, String collectionName, VDBConditions conditions) {
        VDBOptResult<Boolean> result = JBoltVDB.use(vdbId).delete(collectionName, conditions);
        if (result.isSuccess()) {
            logger.info("移除VDB中的{}的{}成功", collectionName,conditions);
            return Result.success();
        } else {
            logger.error("移除VDB中的{}的{}失败,失败原因:{}", collectionName, conditions,result.getFullMsg());
            return Result.error(result.getFullMsg());
        }
    }
}
